package es.deusto.ingenieria.tesoroaventurero;

import es.deusto.ingenieria.is.formulation.Operator;
import es.deusto.ingenieria.is.formulation.State;

public class Mover extends Operator {

	public enum Sentido{
		ARRIBA,
		ABAJO,
		DERECHA,
		IZQUIERDA;
	}
	
	private Sentido sentido;
	
	public Mover (Sentido sentido){
		super("Mover-" + sentido, 1D);
		this.sentido = sentido;
	}
	
	
	protected boolean isApplicable(State state) {
		Escenario escenario = (Escenario) state.getInformation();
		
		switch (this.sentido){
			case ARRIBA:
				return escenario.getPersonaje().y > 0 &&
						!escenario.getCasilla(escenario.getPersonaje().x, escenario.getPersonaje().y).isArriba();
				
			case ABAJO:
				return escenario.getPersonaje().y < escenario.getCasillas().length-1 &&
						!escenario.getCasilla(escenario.getPersonaje().x, escenario.getPersonaje().y).isAbajo();
				
			case DERECHA:
				return escenario.getPersonaje().x < escenario.getCasillas()[0].length-1 &&
						!escenario.getCasilla(escenario.getPersonaje().x, escenario.getPersonaje().y).isDerecha();
						
			case IZQUIERDA:
				return escenario.getPersonaje().x > 0 &&
						!escenario.getCasilla(escenario.getPersonaje().x, escenario.getPersonaje().y).isIzquierda();
		}
		
		return false;
	}
	
	
	protected State effect(State state) {
		Escenario escenario = (Escenario) state.getInformation();
		Escenario newEscenario = escenario.clone();
		
		switch (this.sentido) {
			case DERECHA:
				newEscenario.getPersonaje().x++;
				
			case IZQUIERDA:
				newEscenario.getPersonaje().x--;
				
			case ARRIBA:
				newEscenario.getPersonaje().y--;
			
			case ABAJO:
				newEscenario.getPersonaje().y++;
		}
		
		if (newEscenario.getCasilla(newEscenario.getPersonaje().x, newEscenario.getPersonaje().y).isGema()) {
			newEscenario.getCasilla(newEscenario.getPersonaje().x, newEscenario.getPersonaje().y).setGema(false);
		}
		
		return new State(newEscenario);
	}



}
